%{
	#include "tiger-gram.h"
	#include <string.h>
	#include <stdlib.h>
	#include <stdio.h>
	//extern FILE *yyin;
	extern int nrolinea;
	extern int debugl;
	void printToken(char*, char*, int);
	void contarSaltoLinea(char*);	

	
%}
letra	[a-zA-Z]
digito	[0-9]
main	[\_main]
%%

"("			{  printToken("TPARA", yytext, nrolinea);    return TPARA;  }
")"			{  printToken("TPARC", yytext, nrolinea);    return TPARC;  }
"["         {  printToken("TCRA", yytext, nrolinea);     return TCRA;   }
"]"         {  printToken("TCRC", yytext, nrolinea);     return TCRC;   }
"{"			{  printToken("TLLA", yytext, nrolinea);     return TLLA;	  }
"}"			{  printToken("TLLC", yytext, nrolinea);     return TLLC;	  }
","			{  printToken("TCOMA", yytext, nrolinea);    return TCOMA;  }
";"			{  printToken("TPCOMA", yytext, nrolinea);   return TPCOMA; }
":"			{  printToken("T2PUNTOS", yytext, nrolinea); return T2PUNTOS; }
":="		{  printToken("TASIGN", yytext, nrolinea);   return TASIGN; }
"="			{  printToken("TIGUAL", yytext, nrolinea);   return TIGUAL; }
"."			{  printToken("TPUNTO", yytext, nrolinea);   return TPUNTO; }
"+"			{  printToken("TMAS", yytext, nrolinea);     return TMAS;   }
"-"			{  printToken("TMENOS", yytext, nrolinea);   return TMENOS; }
"*"			{  printToken("TMULT", yytext, nrolinea);    return TMULT;  }
"/"			{  printToken("TDIV", yytext, nrolinea);     return TDIV;   }
"&"			{  printToken("TAND", yytext, nrolinea);     return TAND;   }
"|"			{  printToken("TOR", yytext, nrolinea);      return TOR;    }
">"			{  printToken("TMAY", yytext, nrolinea);     return TMAY;   }
"<"			{  printToken("TMEN", yytext, nrolinea);     return TMEN;   }
">="		{  printToken("TMAYIG", yytext, nrolinea);   return TMAYIG; }
"<="		{  printToken("TMENIG", yytext, nrolinea);   return TMENIG; }
"<>"		{  printToken("TDIF", yytext, nrolinea);     return TDIF;   }
array		{  printToken("TARRAY", yytext, nrolinea);   return TARRAY; }
break		{  printToken("TBREAK", yytext, nrolinea);   return TBREAK; }
do			{  printToken("TDO", yytext, nrolinea);      return TDO;    }
else		{  printToken("TELSE", yytext, nrolinea);    return TELSE;  }
end			{  printToken("TEND", yytext, nrolinea);     return TEND;   }
for			{  printToken("TFOR", yytext, nrolinea);     return TFOR;   }
if			{  printToken("TIF", yytext, nrolinea);      return TIF;    }
in			{  printToken("TIN", yytext, nrolinea);      return TIN;    }
let			{  printToken("TLET", yytext, nrolinea);     return TLET;   }
nil			{  printToken("TNIL", yytext, nrolinea); 	 return TNIL;	}
of			{  printToken("TOF", yytext, nrolinea);      return TOF;    }
then		{  printToken("TTHEN", yytext, nrolinea);    return TTHEN;  }
to			{  printToken("TTO", yytext, nrolinea);      return TTO;    }
type 		{  printToken("TTYPE", yytext, nrolinea);    return TTYPE;  }
var			{  printToken("TVAR", yytext, nrolinea);     return TVAR;   }
while		{  printToken("TWHILE", yytext, nrolinea);   return TWHILE; }

"\""(.)*"\"" {  yylval.lexema = (char *)strdup(yytext);   printToken("TCSTRING", yytext, nrolinea);   return TCSTRING; }

{digito}+ { yylval.lexema = (char *)strdup(yytext); printToken("TCTEINT", yytext, nrolinea);  return TCTEINT; }

{letra}+({letra}|{digito}|"_")*|{main} { yylval.lexema = (char *)strdup(yytext);  printToken("TID", yytext, nrolinea);  return TID; }

("/")("*")(.|\n)*"*/" { contarSaltoLinea(yytext); }     

[ \t]+ 		/* obvia espacios en blanco, tabuladores */
\n      	{ nrolinea++; }
.			{ printf("Error Lexico: simbolo %s no valido en la linea %d\n", yytext, nrolinea ); }

%%

void printToken(char* token, char* lex, int linea){
	if (debugl == 1){
		printf("token: %s, lexema: %s, linea: %d\n", token, lex, linea);
	}
}

/* Cuenta los saltos de linea */
void contarSaltoLinea(char* linea){
	int i;	
	for(i = 0; i < strlen(linea); i++)
		if(linea[i] == '\n')
		{ nrolinea++; }		
}




